using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO;
using System.Web;
using AEL.ACT;
using AEL.COM;
using AEL.BOD;
using BEL;
using HER;

namespace DEL.COM
{
    public class DO_Com_Donacion_Ing
    {

        #region Adapter
        private static CEL.COM.DO_Com_Donacion_Ing _adpCom_Donacion_Ing;
        private static CEL.COM.DO_Com_Donacion_Ing adpCom_Donacion_Ing
        {
            get
            {
                if (_adpCom_Donacion_Ing == null)
                    _adpCom_Donacion_Ing = new CEL.COM.DO_Com_Donacion_Ing();
                return _adpCom_Donacion_Ing;
            }
        }


        private static CEL.COM.DO_Com_Donacion_Ing_Det _adpCom_Donacion_Ing_Det;
        private static CEL.COM.DO_Com_Donacion_Ing_Det adpCom_Donacion_Ing_Det
        {
            get
            {
                if (_adpCom_Donacion_Ing_Det == null)
                    _adpCom_Donacion_Ing_Det = new CEL.COM.DO_Com_Donacion_Ing_Det();
                return _adpCom_Donacion_Ing_Det;
            }
        }

        private static CEL.BOD.DO_Bod_Orden _adpBod_Orden;
        private static CEL.BOD.DO_Bod_Orden adpBod_Orden
        {
            get
            {
                if (_adpBod_Orden == null)
                    _adpBod_Orden = new CEL.BOD.DO_Bod_Orden();
                return _adpBod_Orden;
            }
        }

        private static CEL.BOD.DO_Bod_Kardex _adpBod_Kardex;
        private static CEL.BOD.DO_Bod_Kardex adpBod_Kardex
        {
            get
            {
                if (_adpBod_Kardex == null)
                    _adpBod_Kardex = new CEL.BOD.DO_Bod_Kardex();
                return _adpBod_Kardex;
            }
        }

        #endregion

        #region Operaciones con datos

        public static void EmitirExcepcion(string mensaje, string caso)
        {
            Exception eCaso = new System.Exception(caso);
            Exception otroEX = new System.Exception(mensaje, eCaso);
            throw otroEX;
        }


        public static void Insert_Orden(Scope s, ref Com_Donacion_Ing p_Objeto)
        {
           try
            {
                adpCom_Donacion_Ing_Det.Adapter.BeginTransaction();
                adpBod_Orden.Adapter.Transaction = adpCom_Donacion_Ing_Det.Adapter.Transaction;  
              
                List<Com_Donacion_Ing_Det> lstComDonacionIng = adpCom_Donacion_Ing_Det.GetByDonacion(s, p_Objeto.Id);
                Bod_Orden bodOrden = null;
                foreach (Com_Donacion_Ing_Det comDonacionIngDet in lstComDonacionIng)
                {
                    bodOrden = new Bod_Orden();
                    bodOrden.Origen = "DOI";
                    bodOrden.Tipo = "ING";
                    bodOrden.Origen_Id = p_Objeto.Id;
                    bodOrden.Fecha_Creacion = DateTime.Now;
                    bodOrden.Creacion_Per_Personal_Id = s.Per_Personal_Id;
                    bodOrden.Fecha_Update = DateTime.Now;
                    bodOrden.Update_Per_Personal_Id = s.Per_Personal_Id;
                    bodOrden.Bod_Bodega_Id = p_Objeto.Bod_Bodega_Id;
                    bodOrden.Com_Articulo_Id = comDonacionIngDet.Com_Articulo_Id;
                    bodOrden.Cantidad = comDonacionIngDet.Cantidad;
                    bodOrden.Bod_Unidad_Id = comDonacionIngDet.Referencia_Bod_Unidad_Id;
                    bodOrden.Origen_Det_Id = comDonacionIngDet.Id;
                    bodOrden.Bod_Kardex_Id = null;
                    bodOrden.XML = p_Objeto.Tipo_Nombre + p_Objeto.Motivo_Nombre + p_Objeto.Numero;
                    bodOrden.Fecha = p_Objeto.Fecha;
                    
                        adpBod_Orden.Insert(s, bodOrden);
                        Com_Donacion_Ing_Det bodDonacionIngDetNuevo = new Com_Donacion_Ing_Det(comDonacionIngDet);
                        bodDonacionIngDetNuevo.Bod_Orden_Id = bodOrden.Id;
                        adpCom_Donacion_Ing_Det.Update(s, bodDonacionIngDetNuevo, comDonacionIngDet);
                    
                }
                adpCom_Donacion_Ing_Det.Adapter.CommitTransaction();
            }
            catch (Exception e)
            {
                adpCom_Donacion_Ing_Det.Adapter.RollbackTransaction();
                if (e.Message.StartsWith("MSJ"))
                { throw (e); }
                else
                { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
            }
        }

        public static void Insert_Kardex(Scope s, ref Com_Donacion_Ing p_Objeto)
        {
            try
            {
                adpBod_Orden.Adapter.BeginTransaction();

                List<Bod_Orden> lstBodOrden = adpBod_Orden.GetByOrigenOrigenId(s, "DOI", p_Objeto.Id);
                Bod_Kardex bodKardex = null;
                foreach (Bod_Orden bodOrden in lstBodOrden)
                {
                    bodKardex = new Bod_Kardex();
                    bodKardex.Int_Empresa_Id = s.Int_Empresa_Id;
                    bodKardex.Bod_Bodega_Id = bodOrden.Bod_Bodega_Id;                    
                    bodKardex.Marca = "ABI";
                    bodKardex.Tipo = "ING";
                    bodKardex.Fecha_Creacion = DateTime.Now;
                    bodKardex.Creacion_Per_Personal_Id = s.Per_Personal_Id;
                    bodKardex.Fecha_Update = DateTime.Now;
                    bodKardex.Update_Per_Personal_Id = s.Per_Personal_Id;
                    bodKardex.Com_Articulo_Id = bodOrden.Com_Articulo_Id;
                    bodKardex.Cantidad = bodOrden.Referencia_Cantidad;
                    bodKardex.Xml = bodOrden.Fecha_Creacion.ToString();
                    bodKardex.Fecha = p_Objeto.Fecha;
                    
                        DEL.BOD.DO_Bod_Kardex.Insert(s, ref bodKardex);
                        Bod_Orden nuevoObjeto = new Bod_Orden(bodOrden);
                        nuevoObjeto.Bod_Kardex_Id = bodKardex.Id;
                        adpBod_Orden.Update(s, nuevoObjeto, bodOrden);
                    
                }
                adpBod_Orden.Adapter.CommitTransaction();
            }
            catch (Exception e)
            {
                adpBod_Orden.Adapter.RollbackTransaction();
                if (e.Message.StartsWith("MSJ"))
                { throw (e); }
                else
                { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
            }
        }

        public static void Delete_Kardex(Scope s, ref Com_Donacion_Ing p_Objeto)
        {           
            try
            {                
                List<Bod_Orden> lstBodOrden = adpBod_Orden.GetByOrigenOrigenId(s, "DOI", p_Objeto.Id);
                foreach (Bod_Orden bodOrden in lstBodOrden)
                {
                    if (p_Objeto.Devolucion == "N")
                    {
                        Bod_Orden nuevoObjeto = new Bod_Orden(bodOrden);
                        nuevoObjeto.Bod_Kardex_Id = null;
                        adpBod_Orden.Update(s, nuevoObjeto, bodOrden);
                        List<Bod_Kardex> lstbodKardex = adpBod_Kardex.GetById(s, bodOrden.Bod_Kardex_Id);
                        foreach (Bod_Kardex Bodkardex in lstbodKardex)
                        {
                            DEL.BOD.DO_Bod_Kardex.Delete(s, Bodkardex);
                        } 
                       
                    }
                    else
                    {
                        EmitirExcepcion(TXT_Mensajes._MSJ58, "");                        
                    }
                }                
            }
            catch (Exception e)
            {
                if (e.Message.StartsWith("MSJ"))
                { throw (e); }
                else
                { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
            }
        }

        public static void Delete_Orden(Scope s, ref Com_Donacion_Ing p_Objeto)
        {
            try
            {
                if (p_Objeto.Devolucion == "N")
                {
                    List<Bod_Orden> lstBodOrden = adpBod_Orden.GetByOrigenOrigenId(s, "DOI", p_Objeto.Id);
                    foreach (Bod_Orden bodOrden in lstBodOrden)
                    {
                        List<Com_Donacion_Ing_Det> lstComDonacionIng = adpCom_Donacion_Ing_Det.GetByDonacion(s, p_Objeto.Id);
                        foreach (Com_Donacion_Ing_Det comDonacionIngDet in lstComDonacionIng)
                        {
                            Com_Donacion_Ing_Det comDonacionIngDetNuevo = new Com_Donacion_Ing_Det(comDonacionIngDet);
                            comDonacionIngDetNuevo.Bod_Orden_Id = null;
                            adpCom_Donacion_Ing_Det.Update(s, comDonacionIngDetNuevo, comDonacionIngDet);
                        }
                        adpBod_Orden.Delete(s, bodOrden);
                        
                    }
                }
                else
                {
                    EmitirExcepcion(TXT_Mensajes._MSJ58, "");  
                }               
            }
            catch (Exception e)
            {
                if (e.Message.StartsWith("MSJ"))
                { throw (e); }
                else
                { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
            }
        }
        #endregion

        #region Obtencion de Datos

        public static List<Com_Donacion_Ing> GetByEmpresa(Scope s)
        {
            string filtroParaCEL;
            string[] campos = {"Estado =", "Fecha <=",
                                  "Fecha >=", "Bod_Bodega_Nombre LIKE"};

            FiltroDiccionario dic;
            int encontrados =
                Filtrado.AnalizarExpresionDeFiltrado(s.Expresion_De_Filtrado, campos, out dic, out filtroParaCEL);
            List<Com_Donacion_Ing> resultado;

            if (encontrados > 0)
            {
                s.Expresion_De_Filtrado = filtroParaCEL;

                string estado = "%";
                if (dic["Estado ="] != string.Empty)
                    estado += dic["Estado ="].Trim('\'');

                string bodBodegaNombre = "%";
                if (dic["Bod_Bodega_Nombre LIKE"] != string.Empty)
                    bodBodegaNombre = dic["Bod_Bodega_Nombre LIKE"].Trim('\'');

                DateTime fechaInicio = new DateTime(1900, 1, 1);
                if (dic["Fecha >="] != string.Empty)
                    fechaInicio = Convert.ToDateTime(dic["Fecha >="].Trim('\''));

                DateTime fechaFin = new DateTime(2079, 6, 6);
                if (dic["Fecha <="] != string.Empty)
                    fechaFin = Convert.ToDateTime(dic["Fecha <="].Trim('\''));

                resultado = adpCom_Donacion_Ing.GetByEstado(s, estado, bodBodegaNombre, fechaInicio, fechaFin);
            }
            else
            {
                resultado = adpCom_Donacion_Ing.GetByEmpresa(s);
            }

            return resultado;
        }
        #endregion
    }
}
